<!DOCTYPE html>
<html lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>reconstruct_height_field_from_gradient [HALCON算子参考手册]</title>
<style type="text/css">
      body {
    color: #000000;
    background-color: #ffffff;
    margin: 0;
    font-family: Arial, Helvetica, sans-serif;
}

.body_main {
    margin-left: 35px;
    margin-right: 35px;
}

@media screen and (min-width:992px) {

    .body_main {
        margin-left: 10%;
        margin-right: 10%;
    }

    table.toctable {
        width: 80%
    }
}

@media screen and (min-width:1400px) {

    .body_main {
        margin-left: 15%;
        margin-right: 15%;
    }

    table.toctable {
        width: 70%
    }
}

body>div ul ul {
    margin-left: inherit;
}

a:link {
    color: #0044cc;
}

a:link,
a:visited {
    text-decoration: none;
}

a:link:hover,
a:visited:hover {
    text-decoration: underline;
}

th {
    text-align: left;
}

h1,
h2,
h3,
h4,
h5,
h6 {
    text-rendering: optimizeLegibility;
    color: #666666;
}

code {
    font-family: monospace,monospace;
}

h1 a.halconoperator {
    font-family: Arial, Helvetica, sans-serif;
    color: #666666;
}

h2 a.halconoperator {
    font-family: Arial, Helvetica, sans-serif;
    color: #666666;
}

hr {
    border: 0;
    border-top: solid 1px #f28d26;
}

.pre {
    display: block;
    padding-bottom: 1ex;
    font-family: monospace;
    white-space: pre;
}

pre {
    font-family: monospace, monospace;
    padding: 1ex;
    white-space: pre-wrap;
}

.toc {
    font-size: 80%;
    border-top: 1px dashed #f28d26;
    border-bottom: 1px dashed #f28d26;
    padding-top: 5px;
    padding-bottom: 5px;
}

.inv {
    margin: 0;
    border: 0;
    padding: 0;
}

.banner {
    color: #666666;
    padding-left: 1em;
}

.logo {
    background-color: white;
}

.keyboard {
    font-size: 80%;
    padding-left: 3px;
    padding-right: 3px;
    border-radius: 5px;
    border-width: 1px;
    border-style: solid;
    border-color: #f28d26;
    background-color: #f3f3f3;
}

.warning {
    margin-top: 2ex;
    margin-bottom: 1ex;
    padding: 10px;
    text-align: center;
    border: 1px solid;
    color: #bb0000;
    background-color: #fff7f7
}

.imprint {
    margin-top: 1ex;
    font-size: 80%;
    color: #666666;
}

.imprinthead {
    font-weight: bolder;
    color: #666666;
}

.indexlink {
    text-align: right;
    padding-bottom: 5px;
}

.postscript {
    margin-top: 2ex;
    font-size: 80%;
    color: #666666
}

.evenrow {
    background-color: #e7e7ef;
    vertical-align: top;
}

.oddrow {
    background-color: #f7f7ff;
    vertical-align: top;
}

.headrow {
    background-color: #97979f;
    color: #ffffff;
    vertical-align: top;
}

.logorow {
    vertical-align: top;
}

.error {
    color: red;
}

.var {
    font-style: italic
}

.halconoperator {
    font-family: monospace, monospace;
}

span.operator {
    font-family: monospace, monospace;
}

span.procedure {
    font-family: monospace, monospace;
}

span.operation {
    font-family: monospace, monospace;
}

span.feature {
    font-family: Arial, Helvetica, Homerton, sans-serif;
}

ul {
    padding-left: 1.2em;
}

li.dot {
    list-style-type: square;
    color: #f28d26;
}

.breadcrumb {
    font-size: 80%;
    color: white;
    background-color: #062d64;
    margin-bottom: 20px;
    padding-left: 35px;
    padding-right: 35px;
    padding-bottom: 15px;
}

.webbar {
    font-size: 80%;
    background-color: #dddddd;
    margin-top: 0px;
    margin-left: -35px;
    margin-right: -35px;
    margin-bottom: 0px;
    padding-top: 5px;
    padding-left: 35px;
    padding-right: 35px;
    padding-bottom: 5px;
}

.footer {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    border-top: 1px dashed #f28d26;
    font-size: 80%;
    color: #666666;
    padding-bottom: 8px;
}

.footer .socialmedia a {
    padding-left: 7px;
}

.socialmedia {
    padding-top: 10px;
}

.copyright {
    margin-top: 19px;
}

.breadcrumb a {
    color: #ffffff;
    border-bottom: 1px solid white;
}

.breadcrumb a:link:hover,
.breadcrumb a:visited:hover {
    text-decoration: none;
    border-bottom: none;
}

.heading {
    margin-top: 1ex;
    font-size: 110%;
    font-weight: bold;
    color: #666666;
}

.text {
    color: black;
}

.example {
    font-size: 80%;
    background-color: #f3f3f3;
    border: 1px dashed #666666;
    padding: 10px;
}

.displaymath {
    display: block;
    text-align: center;
    margin-top: 1ex;
    margin-bottom: 1ex;
}

.title {
    float: left;
    padding-top: 3px;
    padding-bottom: 3px;
}

.signnote {
    font-family: Arial, Helvetica, Homerton, sans-serif;
    font-size: 80%;
    color: #666666;
    font-weight: lighter;
    font-style: italic
}

.par {
    margin-bottom: 1.5em;
}

.parhead {
    text-align: right;
}

.parname {
    float: left;
}

.pardesc {
    font-size: 85%;
    margin-top: 0.5em;
    margin-bottom: 0.5em;
    margin-left: 2em;
}

.parcat {
    color: #666;
    font-weight: bold;
}

*[data-if=cpp],
*[data-if=c],
*[data-if=dotnet],
*[data-if=com],
*[data-if=python] {
    display: none;
}

.tabbar {
    text-align: right;
    border-bottom: 1px solid #f28d26;
    margin-bottom: 0.5em;
}

ul.tabs {
    padding-top: 3px;
    padding-bottom: 3px;
    margin-top: 10px;
    margin-bottom: 0;
    font-size: 80%
}

ul.tabs li {
    padding-top: 3px;
    padding-bottom: 3px;
    display: inline;
    overflow: hidden;
    list-style-type: none;
    margin: 0;
    margin-left: 8px;
    border-top: 1px solid #666;
    border-left: 1px solid #666;
    border-right: 1px solid #666;
}

ul.tabs li.active {
    border-left: 1px solid #f28d26;
    border-right: 1px solid #f28d26;
    border-top: 1px solid #f28d26;
    border-bottom: 1px solid #fff;
}

ul.tabs li.inactive {
    background-color: #eee;
}

ul.tabs li a {
    padding-left: 5px;
    padding-right: 5px;
    color: #666;
}

ul.tabs li a:link:hover {
    text-decoration: none;
}

ul.tabs li.inactive a {
    color: #666;
}

ul.tabs li.active a {
    color: black;
}

dl.generic dd {
    margin-bottom: 1em;
}

.pari {
    color: olive;
}

.paro {
    color: maroon;
}

.comment {
    font-size: 80%;
    color: green;
    white-space: nowrap;
}

table.grid {
    border-collapse: collapse;
}

table.grid td {
    padding: 5px;
    border: 1px solid;
}

table.layout {
    border: 0px;
}

table.layout td {
    padding: 5px;
}

table.table {
    border-collapse: collapse;
}

table.table td {
    padding: 5px;
    border-left: 0px;
    border-right: 0px;
}

table.table tr:last-child {
    border-bottom: 1px solid;
}

table.table th {
    padding: 5px;
    border-top: 1px solid;
    border-bottom: 1px solid;
    border-left: 0px;
    border-right: 0px;
}

.details_summary {
    cursor: pointer;
}

table.toctable {
    width: 100%;
}

table.toctable col:first-child {
    width: 20%;
}

table.toctable col:nth-last-child(2) {
    width: 8%;
}

table.altcolored tr:nth-child(even) {
    background-color: #f3f3f3;
}

    </style>
<!--OP_REF_STYLE_END-->
<script>
    <!--
var active_lang='hdevelop';function switchVisibility(obj,active_lang,new_lang)
{var display_style='inline';
for(var i=0;i<obj.length;i++)
{if(obj.item(i).getAttribute('data-if')==new_lang)
{obj.item(i).style.display=display_style;}
if(obj.item(i).getAttribute('data-if')==active_lang)
{obj.item(i).style.display='none';}}
return;}
function toggleLanguage(new_lang,initial)
{if(active_lang!=new_lang)
{var lis=document.getElementsByTagName('li');for(var i=0;i<lis.length;i++)
{if(lis.item(i).id=='syn-'+new_lang)
{lis.item(i).className='active';}
else
{lis.item(i).className='inactive';}}
var divs=document.getElementsByTagName('div');var spans=document.getElementsByTagName('span');switchVisibility(divs,active_lang,new_lang);switchVisibility(spans,active_lang,new_lang);if(!initial)
{setCookie("halcon_reference_language",new_lang,null,null);}
active_lang=new_lang;}
return;}
function setCookie(name,value,domain,exp_offset,path,secure)
{localStorage.setItem(name,value);}
function getCookie(name)
{return localStorage.getItem(name);}
function initialize()
{var qs=location.href.split('?')[1];var qs_lang_raw=location.href.split('interface=')[1];var qs_lang;if(qs_lang_raw)
{qs_lang=qs_lang_raw.split('#')[0];}
var cookie_lang=getCookie("halcon_reference_language");var new_lang;if((qs_lang=="hdevelop")||(qs_lang=="dotnet")||(qs_lang=="python")||(qs_lang=="cpp")||(qs_lang=="c"))
{new_lang=qs_lang;setCookie("halcon_reference_language",new_lang,null,null);}
else if((cookie_lang=="hdevelop")||(cookie_lang=="dotnet")||(cookie_lang=="python")||(cookie_lang=="cpp")||(cookie_lang=="c"))
{new_lang=cookie_lang;}
else
{new_lang="hdevelop";}
toggleLanguage(new_lang,1);return;}
-->

  </script>
</head>
<body onload="initialize();">
<div class="breadcrumb">
<br class="inv"><a href="index.html">目录</a> / <a href="toc_3dreconstruction.html">3D Reconstruction</a> / <a href="toc_3dreconstruction_photometricstereo.html">Photometric Stereo</a><br class="inv">
</div>
<div class="body_main">
<div class="tabbar"><ul class="tabs">
<li id="syn-hdevelop" class="active"><a href="javascript:void(0);" onclick="toggleLanguage('hdevelop')" onfocus="blur()">HDevelop</a></li>
<li id="syn-dotnet" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('dotnet')" onfocus="blur()">.NET</a></li>
<li id="syn-python" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('python')" onfocus="blur()">Python</a></li>
<li id="syn-cpp" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('cpp')" onfocus="blur()">C++</a></li>
<li id="syn-c" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('c')" onfocus="blur()">C</a></li>
</ul></div>
<div class="indexlink">
<a href="index_classes.html"><span data-if="dotnet" style="display:none;">类别</span><span data-if="cpp" style="display:none;">类别</span></a><span data-if="dotnet" style="display:none;"> | </span><span data-if="cpp" style="display:none;"> | </span><a href="index_by_name.html">算子列表</a>
</div>
<!--OP_REF_HEADER_END-->
<h1 id="sec_name">
<span data-if="hdevelop" style="display:inline;">reconstruct_height_field_from_gradient</span><span data-if="c" style="display:none;">T_reconstruct_height_field_from_gradient</span><span data-if="cpp" style="display:none;">ReconstructHeightFieldFromGradient</span><span data-if="dotnet" style="display:none;">ReconstructHeightFieldFromGradient</span><span data-if="python" style="display:none;">reconstruct_height_field_from_gradient</span> (算子名称)</h1>
<h2>名称</h2>
<p><code><span data-if="hdevelop" style="display:inline;">reconstruct_height_field_from_gradient</span><span data-if="c" style="display:none;">T_reconstruct_height_field_from_gradient</span><span data-if="cpp" style="display:none;">ReconstructHeightFieldFromGradient</span><span data-if="dotnet" style="display:none;">ReconstructHeightFieldFromGradient</span><span data-if="python" style="display:none;">reconstruct_height_field_from_gradient</span></code> — Reconstruct a surface from surface gradients.</p>
<h2 id="sec_synopsis">参数签名</h2>
<div data-if="hdevelop" style="display:inline;">
<p>
<code><b>reconstruct_height_field_from_gradient</b>(<a href="#Gradient"><i>Gradient</i></a> : <a href="#HeightField"><i>HeightField</i></a> : <a href="#ReconstructionMethod"><i>ReconstructionMethod</i></a>, <a href="#GenParamName"><i>GenParamName</i></a>, <a href="#GenParamValue"><i>GenParamValue</i></a> : )</code></p>
</div>
<div data-if="c" style="display:none;">
<p>
<code>Herror <b>T_reconstruct_height_field_from_gradient</b>(const Hobject <a href="#Gradient"><i>Gradient</i></a>, Hobject* <a href="#HeightField"><i>HeightField</i></a>, const Htuple <a href="#ReconstructionMethod"><i>ReconstructionMethod</i></a>, const Htuple <a href="#GenParamName"><i>GenParamName</i></a>, const Htuple <a href="#GenParamValue"><i>GenParamValue</i></a>)</code></p>
</div>
<div data-if="cpp" style="display:none;">
<p>
<code>void <b>ReconstructHeightFieldFromGradient</b>(const HObject&amp; <a href="#Gradient"><i>Gradient</i></a>, HObject* <a href="#HeightField"><i>HeightField</i></a>, const HTuple&amp; <a href="#ReconstructionMethod"><i>ReconstructionMethod</i></a>, const HTuple&amp; <a href="#GenParamName"><i>GenParamName</i></a>, const HTuple&amp; <a href="#GenParamValue"><i>GenParamValue</i></a>)</code></p>
<p>
<code><a href="HImage.html">HImage</a> <a href="HImage.html">HImage</a>::<b>ReconstructHeightFieldFromGradient</b>(const HString&amp; <a href="#ReconstructionMethod"><i>ReconstructionMethod</i></a>, const HTuple&amp; <a href="#GenParamName"><i>GenParamName</i></a>, const HTuple&amp; <a href="#GenParamValue"><i>GenParamValue</i></a>) const</code></p>
<p>
<code><a href="HImage.html">HImage</a> <a href="HImage.html">HImage</a>::<b>ReconstructHeightFieldFromGradient</b>(const char* <a href="#ReconstructionMethod"><i>ReconstructionMethod</i></a>, const HTuple&amp; <a href="#GenParamName"><i>GenParamName</i></a>, const HTuple&amp; <a href="#GenParamValue"><i>GenParamValue</i></a>) const</code></p>
<p>
<code><a href="HImage.html">HImage</a> <a href="HImage.html">HImage</a>::<b>ReconstructHeightFieldFromGradient</b>(const wchar_t* <a href="#ReconstructionMethod"><i>ReconstructionMethod</i></a>, const HTuple&amp; <a href="#GenParamName"><i>GenParamName</i></a>, const HTuple&amp; <a href="#GenParamValue"><i>GenParamValue</i></a>) const  <span class="signnote">
            (
            Windows only)
          </span></code></p>
</div>
<div data-if="com" style="display:none;"></div>
<div data-if="dotnet" style="display:none;">
<p>
<code>static void <a href="HOperatorSet.html">HOperatorSet</a>.<b>ReconstructHeightFieldFromGradient</b>(<a href="HObject.html">HObject</a> <a href="#Gradient"><i>gradient</i></a>, out <a href="HObject.html">HObject</a> <a href="#HeightField"><i>heightField</i></a>, <a href="HTuple.html">HTuple</a> <a href="#ReconstructionMethod"><i>reconstructionMethod</i></a>, <a href="HTuple.html">HTuple</a> <a href="#GenParamName"><i>genParamName</i></a>, <a href="HTuple.html">HTuple</a> <a href="#GenParamValue"><i>genParamValue</i></a>)</code></p>
<p>
<code><a href="HImage.html">HImage</a> <a href="HImage.html">HImage</a>.<b>ReconstructHeightFieldFromGradient</b>(string <a href="#ReconstructionMethod"><i>reconstructionMethod</i></a>, <a href="HTuple.html">HTuple</a> <a href="#GenParamName"><i>genParamName</i></a>, <a href="HTuple.html">HTuple</a> <a href="#GenParamValue"><i>genParamValue</i></a>)</code></p>
</div>
<div data-if="python" style="display:none;">
<p>
<code>def <b>reconstruct_height_field_from_gradient</b>(<a href="#Gradient"><i>gradient</i></a>: HObject, <a href="#ReconstructionMethod"><i>reconstruction_method</i></a>: str, <a href="#GenParamName"><i>gen_param_name</i></a>: Sequence[str], <a href="#GenParamValue"><i>gen_param_value</i></a>: Sequence[Union[int, float, str]]) -&gt; HObject</code></p>
</div>
<h2 id="sec_description">描述</h2>
<p><code><span data-if="hdevelop" style="display:inline">reconstruct_height_field_from_gradient</span><span data-if="c" style="display:none">reconstruct_height_field_from_gradient</span><span data-if="cpp" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="com" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="dotnet" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="python" style="display:none">reconstruct_height_field_from_gradient</span></code> reconstructs a surface from
the surface gradients that are given in <a href="#Gradient"><i><code><span data-if="hdevelop" style="display:inline">Gradient</span><span data-if="c" style="display:none">Gradient</span><span data-if="cpp" style="display:none">Gradient</span><span data-if="com" style="display:none">Gradient</span><span data-if="dotnet" style="display:none">gradient</span><span data-if="python" style="display:none">gradient</span></code></i></a>. The surface
is returned as a height field, i.e., an image in which the gray value of each
image point corresponds to a relative height.
</p>
<p>The reconstruction is done by integrating the gradients by different
algorithms that can be selected in the parameter
<a href="#ReconstructionMethod"><i><code><span data-if="hdevelop" style="display:inline">ReconstructionMethod</span><span data-if="c" style="display:none">ReconstructionMethod</span><span data-if="cpp" style="display:none">ReconstructionMethod</span><span data-if="com" style="display:none">ReconstructionMethod</span><span data-if="dotnet" style="display:none">reconstructionMethod</span><span data-if="python" style="display:none">reconstruction_method</span></code></i></a>.  Because gradient fields are typically
non-integrable due to noise, the various algorithms return a solution in a
least-squares sense.  The algorithms differ in the way how they model the
boundary condition.  Currently three algorithms are supported:
<i><span data-if="hdevelop" style="display:inline">'fft_cyclic'</span><span data-if="c" style="display:none">"fft_cyclic"</span><span data-if="cpp" style="display:none">"fft_cyclic"</span><span data-if="com" style="display:none">"fft_cyclic"</span><span data-if="dotnet" style="display:none">"fft_cyclic"</span><span data-if="python" style="display:none">"fft_cyclic"</span></i>, <i><span data-if="hdevelop" style="display:inline">'rft_cyclic'</span><span data-if="c" style="display:none">"rft_cyclic"</span><span data-if="cpp" style="display:none">"rft_cyclic"</span><span data-if="com" style="display:none">"rft_cyclic"</span><span data-if="dotnet" style="display:none">"rft_cyclic"</span><span data-if="python" style="display:none">"rft_cyclic"</span></i> and <i><span data-if="hdevelop" style="display:inline">'poisson'</span><span data-if="c" style="display:none">"poisson"</span><span data-if="cpp" style="display:none">"poisson"</span><span data-if="com" style="display:none">"poisson"</span><span data-if="dotnet" style="display:none">"poisson"</span><span data-if="python" style="display:none">"poisson"</span></i>.
</p>
<p><b>Reconstruction with Fast Fourier transforms</b>
</p>
<p>The variants <i><span data-if="hdevelop" style="display:inline">'fft_cyclic'</span><span data-if="c" style="display:none">"fft_cyclic"</span><span data-if="cpp" style="display:none">"fft_cyclic"</span><span data-if="com" style="display:none">"fft_cyclic"</span><span data-if="dotnet" style="display:none">"fft_cyclic"</span><span data-if="python" style="display:none">"fft_cyclic"</span></i> and <i><span data-if="hdevelop" style="display:inline">'rft_cyclic'</span><span data-if="c" style="display:none">"rft_cyclic"</span><span data-if="cpp" style="display:none">"rft_cyclic"</span><span data-if="com" style="display:none">"rft_cyclic"</span><span data-if="dotnet" style="display:none">"rft_cyclic"</span><span data-if="python" style="display:none">"rft_cyclic"</span></i> assume that the
image function is cyclic at the boundaries. Note that due to the assumed
cyclic image function artifacts may occur at the image boundaries. Thus, in
most cases, we recommend to use the <i><span data-if="hdevelop" style="display:inline">'poisson'</span><span data-if="c" style="display:none">"poisson"</span><span data-if="cpp" style="display:none">"poisson"</span><span data-if="com" style="display:none">"poisson"</span><span data-if="dotnet" style="display:none">"poisson"</span><span data-if="python" style="display:none">"poisson"</span></i> algorithm instead.
</p>
<p>The difference between <i><span data-if="hdevelop" style="display:inline">'fft_cyclic'</span><span data-if="c" style="display:none">"fft_cyclic"</span><span data-if="cpp" style="display:none">"fft_cyclic"</span><span data-if="com" style="display:none">"fft_cyclic"</span><span data-if="dotnet" style="display:none">"fft_cyclic"</span><span data-if="python" style="display:none">"fft_cyclic"</span></i> and <i><span data-if="hdevelop" style="display:inline">'rft_cyclic'</span><span data-if="c" style="display:none">"rft_cyclic"</span><span data-if="cpp" style="display:none">"rft_cyclic"</span><span data-if="com" style="display:none">"rft_cyclic"</span><span data-if="dotnet" style="display:none">"rft_cyclic"</span><span data-if="python" style="display:none">"rft_cyclic"</span></i> is that
the rft version has faster processing times and requires less memory than
the fft version. While theoretically fft and rft should return the same
result, the fft version is numerically slightly more accurate.  As
<code><span data-if="hdevelop" style="display:inline">reconstruct_height_field_from_gradient</span><span data-if="c" style="display:none">reconstruct_height_field_from_gradient</span><span data-if="cpp" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="com" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="dotnet" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="python" style="display:none">reconstruct_height_field_from_gradient</span></code> internally uses a fast Fourier
transform, the run time of 该算子 can be influenced by a previous call
to <a href="optimize_fft_speed.html"><code><span data-if="hdevelop" style="display:inline">optimize_fft_speed</span><span data-if="c" style="display:none">optimize_fft_speed</span><span data-if="cpp" style="display:none">OptimizeFftSpeed</span><span data-if="com" style="display:none">OptimizeFftSpeed</span><span data-if="dotnet" style="display:none">OptimizeFftSpeed</span><span data-if="python" style="display:none">optimize_fft_speed</span></code></a> or <a href="optimize_rft_speed.html"><code><span data-if="hdevelop" style="display:inline">optimize_rft_speed</span><span data-if="c" style="display:none">optimize_rft_speed</span><span data-if="cpp" style="display:none">OptimizeRftSpeed</span><span data-if="com" style="display:none">OptimizeRftSpeed</span><span data-if="dotnet" style="display:none">OptimizeRftSpeed</span><span data-if="python" style="display:none">optimize_rft_speed</span></code></a>, respectively.
</p>
<p><b>Reconstruction according to Poisson</b>
</p>
<p>The <i><span data-if="hdevelop" style="display:inline">'poisson'</span><span data-if="c" style="display:none">"poisson"</span><span data-if="cpp" style="display:none">"poisson"</span><span data-if="com" style="display:none">"poisson"</span><span data-if="dotnet" style="display:none">"poisson"</span><span data-if="python" style="display:none">"poisson"</span></i> algorithm assumes that the image has constant gradients
at the image border. In most cases, it is the recommended reconstruction
method for <code><span data-if="hdevelop" style="display:inline">reconstruct_height_field_from_gradient</span><span data-if="c" style="display:none">reconstruct_height_field_from_gradient</span><span data-if="cpp" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="com" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="dotnet" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="python" style="display:none">reconstruct_height_field_from_gradient</span></code>. Its run time can
only be optimized by setting <a href="#GenParamName"><i><code><span data-if="hdevelop" style="display:inline">GenParamName</span><span data-if="c" style="display:none">GenParamName</span><span data-if="cpp" style="display:none">GenParamName</span><span data-if="com" style="display:none">GenParamName</span><span data-if="dotnet" style="display:none">genParamName</span><span data-if="python" style="display:none">gen_param_name</span></code></i></a> to <i><span data-if="hdevelop" style="display:inline">'optimize_speed'</span><span data-if="c" style="display:none">"optimize_speed"</span><span data-if="cpp" style="display:none">"optimize_speed"</span><span data-if="com" style="display:none">"optimize_speed"</span><span data-if="dotnet" style="display:none">"optimize_speed"</span><span data-if="python" style="display:none">"optimize_speed"</span></i>
and <a href="#GenParamValue"><i><code><span data-if="hdevelop" style="display:inline">GenParamValue</span><span data-if="c" style="display:none">GenParamValue</span><span data-if="cpp" style="display:none">GenParamValue</span><span data-if="com" style="display:none">GenParamValue</span><span data-if="dotnet" style="display:none">genParamValue</span><span data-if="python" style="display:none">gen_param_value</span></code></i></a> to <i><span data-if="hdevelop" style="display:inline">'standard'</span><span data-if="c" style="display:none">"standard"</span><span data-if="cpp" style="display:none">"standard"</span><span data-if="com" style="display:none">"standard"</span><span data-if="dotnet" style="display:none">"standard"</span><span data-if="python" style="display:none">"standard"</span></i>, <i><span data-if="hdevelop" style="display:inline">'patient'</span><span data-if="c" style="display:none">"patient"</span><span data-if="cpp" style="display:none">"patient"</span><span data-if="com" style="display:none">"patient"</span><span data-if="dotnet" style="display:none">"patient"</span><span data-if="python" style="display:none">"patient"</span></i>, or
<i><span data-if="hdevelop" style="display:inline">'exhaustive'</span><span data-if="c" style="display:none">"exhaustive"</span><span data-if="cpp" style="display:none">"exhaustive"</span><span data-if="com" style="display:none">"exhaustive"</span><span data-if="dotnet" style="display:none">"exhaustive"</span><span data-if="python" style="display:none">"exhaustive"</span></i>. These parameters are described in more detail with the
description of <a href="optimize_fft_speed.html"><code><span data-if="hdevelop" style="display:inline">optimize_fft_speed</span><span data-if="c" style="display:none">optimize_fft_speed</span><span data-if="cpp" style="display:none">OptimizeFftSpeed</span><span data-if="com" style="display:none">OptimizeFftSpeed</span><span data-if="dotnet" style="display:none">OptimizeFftSpeed</span><span data-if="python" style="display:none">optimize_fft_speed</span></code></a>.
</p>
<p>Note that by default, the <i><span data-if="hdevelop" style="display:inline">'poisson'</span><span data-if="c" style="display:none">"poisson"</span><span data-if="cpp" style="display:none">"poisson"</span><span data-if="com" style="display:none">"poisson"</span><span data-if="dotnet" style="display:none">"poisson"</span><span data-if="python" style="display:none">"poisson"</span></i> algorithm uses a cache that
depends on the image size and that speeds up the reconstruction
significantly, provided that all images have the same size. The cache is
allocated at the first time when the <i><span data-if="hdevelop" style="display:inline">'poisson'</span><span data-if="c" style="display:none">"poisson"</span><span data-if="cpp" style="display:none">"poisson"</span><span data-if="com" style="display:none">"poisson"</span><span data-if="dotnet" style="display:none">"poisson"</span><span data-if="python" style="display:none">"poisson"</span></i> algorithm is
called. Therefore the first call always takes longer than subsequent
calls. The additionally needed memory corresponds to the memory needed for
the specific size of one image.  Please note that when calling 该算子
with different image sizes, the cache needs to be reallocated, which leads to
a longer processing time. In this case it may be preferable to not use the
cache. To switch off the caching, you must set the parameter
<a href="#GenParamName"><i><code><span data-if="hdevelop" style="display:inline">GenParamName</span><span data-if="c" style="display:none">GenParamName</span><span data-if="cpp" style="display:none">GenParamName</span><span data-if="com" style="display:none">GenParamName</span><span data-if="dotnet" style="display:none">genParamName</span><span data-if="python" style="display:none">gen_param_name</span></code></i></a> to <i><span data-if="hdevelop" style="display:inline">'caching'</span><span data-if="c" style="display:none">"caching"</span><span data-if="cpp" style="display:none">"caching"</span><span data-if="com" style="display:none">"caching"</span><span data-if="dotnet" style="display:none">"caching"</span><span data-if="python" style="display:none">"caching"</span></i> and the parameter
<a href="#GenParamValue"><i><code><span data-if="hdevelop" style="display:inline">GenParamValue</span><span data-if="c" style="display:none">GenParamValue</span><span data-if="cpp" style="display:none">GenParamValue</span><span data-if="com" style="display:none">GenParamValue</span><span data-if="dotnet" style="display:none">genParamValue</span><span data-if="python" style="display:none">gen_param_value</span></code></i></a> to <i><span data-if="hdevelop" style="display:inline">'no_cache'</span><span data-if="c" style="display:none">"no_cache"</span><span data-if="cpp" style="display:none">"no_cache"</span><span data-if="com" style="display:none">"no_cache"</span><span data-if="dotnet" style="display:none">"no_cache"</span><span data-if="python" style="display:none">"no_cache"</span></i>.  The cache can explicitly be
deallocated by setting <a href="#GenParamName"><i><code><span data-if="hdevelop" style="display:inline">GenParamName</span><span data-if="c" style="display:none">GenParamName</span><span data-if="cpp" style="display:none">GenParamName</span><span data-if="com" style="display:none">GenParamName</span><span data-if="dotnet" style="display:none">genParamName</span><span data-if="python" style="display:none">gen_param_name</span></code></i></a> to <i><span data-if="hdevelop" style="display:inline">'caching'</span><span data-if="c" style="display:none">"caching"</span><span data-if="cpp" style="display:none">"caching"</span><span data-if="com" style="display:none">"caching"</span><span data-if="dotnet" style="display:none">"caching"</span><span data-if="python" style="display:none">"caching"</span></i> and
<a href="#GenParamValue"><i><code><span data-if="hdevelop" style="display:inline">GenParamValue</span><span data-if="c" style="display:none">GenParamValue</span><span data-if="cpp" style="display:none">GenParamValue</span><span data-if="com" style="display:none">GenParamValue</span><span data-if="dotnet" style="display:none">genParamValue</span><span data-if="python" style="display:none">gen_param_value</span></code></i></a> to <i><span data-if="hdevelop" style="display:inline">'free_cache'</span><span data-if="c" style="display:none">"free_cache"</span><span data-if="cpp" style="display:none">"free_cache"</span><span data-if="com" style="display:none">"free_cache"</span><span data-if="dotnet" style="display:none">"free_cache"</span><span data-if="python" style="display:none">"free_cache"</span></i>.  However, in the majority of
cases, we recommend to use the cache, i.e., to use the default setting for
the parameter <i><span data-if="hdevelop" style="display:inline">'caching'</span><span data-if="c" style="display:none">"caching"</span><span data-if="cpp" style="display:none">"caching"</span><span data-if="com" style="display:none">"caching"</span><span data-if="dotnet" style="display:none">"caching"</span><span data-if="python" style="display:none">"caching"</span></i>.
</p>
<p><b>Saving and loading optimization parameters</b>
</p>
<p>The optimization parameters for all algorithms can be saved and loaded by
<a href="write_fft_optimization_data.html"><code><span data-if="hdevelop" style="display:inline">write_fft_optimization_data</span><span data-if="c" style="display:none">write_fft_optimization_data</span><span data-if="cpp" style="display:none">WriteFftOptimizationData</span><span data-if="com" style="display:none">WriteFftOptimizationData</span><span data-if="dotnet" style="display:none">WriteFftOptimizationData</span><span data-if="python" style="display:none">write_fft_optimization_data</span></code></a> and <a href="read_fft_optimization_data.html"><code><span data-if="hdevelop" style="display:inline">read_fft_optimization_data</span><span data-if="c" style="display:none">read_fft_optimization_data</span><span data-if="cpp" style="display:none">ReadFftOptimizationData</span><span data-if="com" style="display:none">ReadFftOptimizationData</span><span data-if="dotnet" style="display:none">ReadFftOptimizationData</span><span data-if="python" style="display:none">read_fft_optimization_data</span></code></a>.
</p>
<p><b>Non obvious applications</b>
</p>
<p>Please note that 该算子 <code><span data-if="hdevelop" style="display:inline">reconstruct_height_field_from_gradient</span><span data-if="c" style="display:none">reconstruct_height_field_from_gradient</span><span data-if="cpp" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="com" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="dotnet" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="python" style="display:none">reconstruct_height_field_from_gradient</span></code>
has various non-obvious applications, especially in the field called gradient
domain manipulation technique. In many applications, the gradient values that
are passed as input to 该算子 do not have the semantics of surface
gradients (i.e., the first derivatives of the height values), but are rather
the first derivatives of other kinds of parameters, typically gray values
(then, the gradients have the semantics of gray value edges). When processing
these gradient images by various means, e.g., by adding or subtracting
images, or by a filtering, the original gradient values are altered and the
subsequent call to <code><span data-if="hdevelop" style="display:inline">reconstruct_height_field_from_gradient</span><span data-if="c" style="display:none">reconstruct_height_field_from_gradient</span><span data-if="cpp" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="com" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="dotnet" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="python" style="display:none">reconstruct_height_field_from_gradient</span></code> delivers a
modified image, in which, e.g., unwanted edges are removed or the contrast
has been changed locally. Typical applications are noise removal, seamless
fusion of images, or high dynamic range compression.
</p>
<h2 id="sec_attention">注意</h2>
<p><code><span data-if="hdevelop" style="display:inline">reconstruct_height_field_from_gradient</span><span data-if="c" style="display:none">reconstruct_height_field_from_gradient</span><span data-if="cpp" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="com" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="dotnet" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="python" style="display:none">reconstruct_height_field_from_gradient</span></code> takes into account the values
of all pixels in <a href="#Gradient"><i><code><span data-if="hdevelop" style="display:inline">Gradient</span><span data-if="c" style="display:none">Gradient</span><span data-if="cpp" style="display:none">Gradient</span><span data-if="com" style="display:none">Gradient</span><span data-if="dotnet" style="display:none">gradient</span><span data-if="python" style="display:none">gradient</span></code></i></a>, not only the values within its domain.
If <a href="#Gradient"><i><code><span data-if="hdevelop" style="display:inline">Gradient</span><span data-if="c" style="display:none">Gradient</span><span data-if="cpp" style="display:none">Gradient</span><span data-if="com" style="display:none">Gradient</span><span data-if="dotnet" style="display:none">gradient</span><span data-if="python" style="display:none">gradient</span></code></i></a> does not have a full domain, one could cut out the
relevant square part of the gradient field and generate a
smaller image with full domain.</p>
<h2 id="sec_execution">运行信息</h2>
<ul>
  <li>多线程类型:可重入(与非独占操作符并行运行)。</li>
<li>多线程作用域:全局(可以从任何线程调用)。</li>
  
    <li>Automatically parallelized on internal data level.</li>
  
</ul>
<h2 id="sec_parameters">参数表</h2>
  <div class="par">
<div class="parhead">
<span id="Gradient" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Gradient</span><span data-if="c" style="display:none">Gradient</span><span data-if="cpp" style="display:none">Gradient</span><span data-if="com" style="display:none">Gradient</span><span data-if="dotnet" style="display:none">gradient</span><span data-if="python" style="display:none">gradient</span></code></b> (input_object)  </span><span>singlechannelimage <code>→</code> <span data-if="hdevelop" style="display:inline">object</span><span data-if="dotnet" style="display:none"><a href="HImage.html">HImage</a></span><span data-if="python" style="display:none">HObject</span><span data-if="cpp" style="display:none"><a href="HImage.html">HImage</a></span><span data-if="c" style="display:none">Hobject</span> (vector_field)</span>
</div>
<p class="pardesc">The gradient field of the image.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="HeightField" class="parname"><b><code><span data-if="hdevelop" style="display:inline">HeightField</span><span data-if="c" style="display:none">HeightField</span><span data-if="cpp" style="display:none">HeightField</span><span data-if="com" style="display:none">HeightField</span><span data-if="dotnet" style="display:none">heightField</span><span data-if="python" style="display:none">height_field</span></code></b> (output_object)  </span><span>image <code>→</code> <span data-if="hdevelop" style="display:inline">object</span><span data-if="dotnet" style="display:none"><a href="HImage.html">HImage</a></span><span data-if="python" style="display:none">HObject</span><span data-if="cpp" style="display:none"><a href="HImage.html">HImage</a></span><span data-if="c" style="display:none">Hobject *</span> (real)</span>
</div>
<p class="pardesc">Reconstructed height field.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="ReconstructionMethod" class="parname"><b><code><span data-if="hdevelop" style="display:inline">ReconstructionMethod</span><span data-if="c" style="display:none">ReconstructionMethod</span><span data-if="cpp" style="display:none">ReconstructionMethod</span><span data-if="com" style="display:none">ReconstructionMethod</span><span data-if="dotnet" style="display:none">reconstructionMethod</span><span data-if="python" style="display:none">reconstruction_method</span></code></b> (input_control)  </span><span>string <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">str</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (string)</span><span data-if="dotnet" style="display:none"> (<i>string</i>)</span><span data-if="cpp" style="display:none"> (<i>HString</i>)</span><span data-if="c" style="display:none"> (<i>char*</i>)</span></span>
</div>
<p class="pardesc">Type of the reconstruction method.</p>
<p class="pardesc"><span class="parcat">Default:
      </span>
    <span data-if="hdevelop" style="display:inline">'poisson'</span>
    <span data-if="c" style="display:none">"poisson"</span>
    <span data-if="cpp" style="display:none">"poisson"</span>
    <span data-if="com" style="display:none">"poisson"</span>
    <span data-if="dotnet" style="display:none">"poisson"</span>
    <span data-if="python" style="display:none">"poisson"</span>
</p>
<p class="pardesc"><span class="parcat">List of values:
      </span><span data-if="hdevelop" style="display:inline">'fft_cyclic'</span><span data-if="c" style="display:none">"fft_cyclic"</span><span data-if="cpp" style="display:none">"fft_cyclic"</span><span data-if="com" style="display:none">"fft_cyclic"</span><span data-if="dotnet" style="display:none">"fft_cyclic"</span><span data-if="python" style="display:none">"fft_cyclic"</span>, <span data-if="hdevelop" style="display:inline">'poisson'</span><span data-if="c" style="display:none">"poisson"</span><span data-if="cpp" style="display:none">"poisson"</span><span data-if="com" style="display:none">"poisson"</span><span data-if="dotnet" style="display:none">"poisson"</span><span data-if="python" style="display:none">"poisson"</span>, <span data-if="hdevelop" style="display:inline">'rft_cyclic'</span><span data-if="c" style="display:none">"rft_cyclic"</span><span data-if="cpp" style="display:none">"rft_cyclic"</span><span data-if="com" style="display:none">"rft_cyclic"</span><span data-if="dotnet" style="display:none">"rft_cyclic"</span><span data-if="python" style="display:none">"rft_cyclic"</span></p>
</div>
  <div class="par">
<div class="parhead">
<span id="GenParamName" class="parname"><b><code><span data-if="hdevelop" style="display:inline">GenParamName</span><span data-if="c" style="display:none">GenParamName</span><span data-if="cpp" style="display:none">GenParamName</span><span data-if="com" style="display:none">GenParamName</span><span data-if="dotnet" style="display:none">genParamName</span><span data-if="python" style="display:none">gen_param_name</span></code></b> (input_control)  </span><span>string-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[str]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (string)</span><span data-if="dotnet" style="display:none"> (<i>string</i>)</span><span data-if="cpp" style="display:none"> (<i>HString</i>)</span><span data-if="c" style="display:none"> (<i>char*</i>)</span></span>
</div>
<p class="pardesc">Names of the generic parameters.</p>
<p class="pardesc"><span class="parcat">Default:
      </span>[]</p>
<p class="pardesc"><span class="parcat">List of values:
      </span><span data-if="hdevelop" style="display:inline">'caching'</span><span data-if="c" style="display:none">"caching"</span><span data-if="cpp" style="display:none">"caching"</span><span data-if="com" style="display:none">"caching"</span><span data-if="dotnet" style="display:none">"caching"</span><span data-if="python" style="display:none">"caching"</span>, <span data-if="hdevelop" style="display:inline">'optimize_speed'</span><span data-if="c" style="display:none">"optimize_speed"</span><span data-if="cpp" style="display:none">"optimize_speed"</span><span data-if="com" style="display:none">"optimize_speed"</span><span data-if="dotnet" style="display:none">"optimize_speed"</span><span data-if="python" style="display:none">"optimize_speed"</span></p>
</div>
  <div class="par">
<div class="parhead">
<span id="GenParamValue" class="parname"><b><code><span data-if="hdevelop" style="display:inline">GenParamValue</span><span data-if="c" style="display:none">GenParamValue</span><span data-if="cpp" style="display:none">GenParamValue</span><span data-if="com" style="display:none">GenParamValue</span><span data-if="dotnet" style="display:none">genParamValue</span><span data-if="python" style="display:none">gen_param_value</span></code></b> (input_control)  </span><span>integer-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[int, float, str]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (integer / </span><span data-if="hdevelop" style="display:inline">real / </span><span data-if="hdevelop" style="display:inline">string)</span><span data-if="dotnet" style="display:none"> (<i>int</i> / </span><span data-if="dotnet" style="display:none">long / </span><span data-if="dotnet" style="display:none">double / </span><span data-if="dotnet" style="display:none">string)</span><span data-if="cpp" style="display:none"> (<i>Hlong</i> / </span><span data-if="cpp" style="display:none">double / </span><span data-if="cpp" style="display:none">HString)</span><span data-if="c" style="display:none"> (<i>Hlong</i> / </span><span data-if="c" style="display:none">double / </span><span data-if="c" style="display:none">char*)</span></span>
</div>
<p class="pardesc">Values of the generic parameters.</p>
<p class="pardesc"><span class="parcat">Default:
      </span>[]</p>
<p class="pardesc"><span class="parcat">List of values:
      </span><span data-if="hdevelop" style="display:inline">'exhaustive'</span><span data-if="c" style="display:none">"exhaustive"</span><span data-if="cpp" style="display:none">"exhaustive"</span><span data-if="com" style="display:none">"exhaustive"</span><span data-if="dotnet" style="display:none">"exhaustive"</span><span data-if="python" style="display:none">"exhaustive"</span>, <span data-if="hdevelop" style="display:inline">'free_cache'</span><span data-if="c" style="display:none">"free_cache"</span><span data-if="cpp" style="display:none">"free_cache"</span><span data-if="com" style="display:none">"free_cache"</span><span data-if="dotnet" style="display:none">"free_cache"</span><span data-if="python" style="display:none">"free_cache"</span>, <span data-if="hdevelop" style="display:inline">'no_cache'</span><span data-if="c" style="display:none">"no_cache"</span><span data-if="cpp" style="display:none">"no_cache"</span><span data-if="com" style="display:none">"no_cache"</span><span data-if="dotnet" style="display:none">"no_cache"</span><span data-if="python" style="display:none">"no_cache"</span>, <span data-if="hdevelop" style="display:inline">'patient'</span><span data-if="c" style="display:none">"patient"</span><span data-if="cpp" style="display:none">"patient"</span><span data-if="com" style="display:none">"patient"</span><span data-if="dotnet" style="display:none">"patient"</span><span data-if="python" style="display:none">"patient"</span>, <span data-if="hdevelop" style="display:inline">'standard'</span><span data-if="c" style="display:none">"standard"</span><span data-if="cpp" style="display:none">"standard"</span><span data-if="com" style="display:none">"standard"</span><span data-if="dotnet" style="display:none">"standard"</span><span data-if="python" style="display:none">"standard"</span>, <span data-if="hdevelop" style="display:inline">'use_cache'</span><span data-if="c" style="display:none">"use_cache"</span><span data-if="cpp" style="display:none">"use_cache"</span><span data-if="com" style="display:none">"use_cache"</span><span data-if="dotnet" style="display:none">"use_cache"</span><span data-if="python" style="display:none">"use_cache"</span></p>
</div>
<h2 id="sec_result">结果</h2>
<p>If the parameters are valid <code><span data-if="hdevelop" style="display:inline">reconstruct_height_field_from_gradient</span><span data-if="c" style="display:none">reconstruct_height_field_from_gradient</span><span data-if="cpp" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="com" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="dotnet" style="display:none">ReconstructHeightFieldFromGradient</span><span data-if="python" style="display:none">reconstruct_height_field_from_gradient</span></code>
返回值 <TT>2</TT> (
      <TT>H_MSG_TRUE</TT>)
    . 如有必要，将引发异常。</p>
<h2 id="sec_references">References</h2>
<p>

M. Kazhdan, M. Bolitho, and H. Hoppe:  “Poisson Surface Reconstruction.”
Symposium on Geometry Processing (June 2006).
</p>
<h2 id="sec_module">模块</h2>
<p>
3D Metrology</p>
<!--OP_REF_FOOTER_START-->
<hr>
<div class="indexlink">
<a href="index_classes.html"><span data-if="dotnet" style="display:none;">类别</span><span data-if="cpp" style="display:none;">类别</span></a><span data-if="dotnet" style="display:none;"> | </span><span data-if="cpp" style="display:none;"> | </span><a href="index_by_name.html">算子列表</a>
</div>
<div class="footer">
<div class="copyright">HALCON算子参考手册 Copyright © 2015-2023 51Halcon</div>
</div>
</div>
</body>
</html>
